package com.xinzhitong.www.service;

import com.xinzhitong.www.enumeration.PostOrderType;
import com.xinzhitong.www.exception.ConsignConditionException;
import com.xinzhitong.www.exception.ConsignException;
import com.xinzhitong.www.exception.ConsignGeneralException;
import com.xinzhitong.www.exception.consign.NullConsignException;
import com.xinzhitong.www.utils.MyPageInfo;

import java.util.List;
import java.util.Map;

/**
 * 委培服务
 *
 * @author 魏骆淳
 */
public interface ConsignService {

    /**
     * 获取委培信息
     *
     * @param consignId 委培id
     * @return 委培信息
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignInformation(Integer consignId) throws ConsignException;

    /**
     * 委培报名
     *
     * @param consignId 委培id
     * @throws ConsignException 委培异常
     */
    void applyConsign(Integer consignId) throws ConsignException;

    /**
     * 获取委培报名信息
     *
     * @param consignId 委培id
     * @return 委培报名信息
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignApplyInformation(Integer consignId) throws ConsignException;


    /**
     * 获取委培时间和地点
     *
     * @param consignId 委培id
     * @return 委培时间和地点
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignTimeAndLocation(Integer consignId) throws ConsignException;

    /**
     * 根据条件筛选委培
     *
     * @param conditions       条件
     * @param pageNo           页码
     * @param pageSize         页大小
     * @param consignOrderType 排序类型
     * @return 委培
     * @throws ConsignException 委培异常
     */
    MyPageInfo getConsignSatisfyTheConditionOf(
            Map<String, Object> conditions,
            PostOrderType consignOrderType,
            Integer pageNo,
            Integer pageSize
    ) throws NullConsignException;

    /**
     * 获取某月委培日期
     *
     * @param year  年
     * @param month 月
     * @return 委培日期
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignTime(Integer year, Integer month) throws ConsignException;

    /**
     * 获取委培系统消息
     *
     * @param consignId 委培id
     * @return 委培系统消息
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignSystemMessage(Integer consignId) throws ConsignException;

    /**
     * 批量删除委培
     *
     * @param idList 委培id列表
     * @return 删除成功信息
     */
    String deleteConsign(List<Integer> idList);

    /**
     * 获取委培报名情况
     *
     * @param consignId 委培id
     * @return 委培报名情况
     * @throws ConsignConditionException 委培报名情况异常
     */
    List<Map<String, Object>> getConsignCondition(Integer consignId) throws ConsignConditionException;

    /**
     * 获取新增委培报名人数
     *
     * @return 人数
     */
    Integer getConsignNewEnroll();

    /**
     * 下架委培
     *
     * @param id 委培id
     * @return 空
     */
    String underConsign(Integer id);

    /**
     * 获取委培概览并支持关键字和状态查找
     *
     * @param state    状态
     * @param name     名字关键字
     * @param pageNo   页大小
     * @param pageSize 页码
     * @return 委培概览
     * @throws ConsignGeneralException 岗位概览异常
     */
    MyPageInfo getConsignGeneral(String state, String name, Integer pageNo, Integer pageSize)
            throws ConsignGeneralException;

    /**
     * 保存新增委培
     *
     * @param map 委培
     */
    void saveConsign(Map<String, Object> map);

    /**
     * 获取保存的委培信息
     *
     * @return 委培信息
     */
    Map<String, Object> getSavedConsign() throws ConsignException;

    /**
     * 发布新增委培
     *
     * @param positionId           职位id
     * @param requirePopulation    要求人数
     * @param contact              联系方式
     * @param address              地址
     * @param baseSalary           基础工资
     * @param maxSalary            最大工资
     * @param minSalary            最小工资
     * @param paySalaryDate        发薪日期
     * @param payType              结算方式
     * @param salaryOtherNotice    工资其他说明
     * @param liveNotice           住宿说明
     * @param foodNotice           饮食说明
     * @param socialSecurityNotice 社保说明
     * @param liveFoodOtherNotice  其他说明
     * @param jobText              工作内容
     * @param jobTimeNotice        工作时间说明
     * @param jobWay               工作方式
     * @param jobOtherNotice       工作其他说明
     * @param sexRequest           性别要求
     * @param maxAgeRequest        最大年龄要求
     * @param minAgeRequest        最小年龄要求
     * @param eduBackground        学历要求
     * @param minExpRequest        最小经验要求
     * @param maxExpRequest        最大经验要求
     * @param credentialRequest    证书要求
     * @param employOtherNotice    雇佣其他说明
     * @param startTime            开始时间
     * @param endTime              结束时间
     * @param deadline             截止时间
     * @param applyRequest         报名要求
     * @param otherNotice          其他说明
     */
    void releaseConsign(
            Integer positionId,
            Integer requirePopulation,
            String contact,
            String address,
            double baseSalary,
            double maxSalary,
            double minSalary,
            Integer paySalaryDate,
            String payType,
            String salaryOtherNotice,
            String liveNotice,
            String foodNotice,
            String socialSecurityNotice,
            String liveFoodOtherNotice,
            String jobText,
            String jobTimeNotice,
            String jobWay,
            String jobOtherNotice,
            Boolean sexRequest,
            Integer maxAgeRequest,
            Integer minAgeRequest,
            String eduBackground,
            Integer minExpRequest,
            Integer maxExpRequest,
            String credentialRequest,
            String employOtherNotice,
            String startTime,
            String endTime,
            String deadline,
            String applyRequest,
            String otherNotice
    );

    /**
     * 获取委培完整信息
     *
     * @param consignId 委培id
     * @return 委培完整信息
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignTotalInformation(Integer consignId) throws ConsignException;

    /**
     * 编辑委培
     *
     * @param consignId            委培id
     * @param positionId           职位id
     * @param requirePopulation    要求人数
     * @param contact              联系方式
     * @param address              地址
     * @param baseSalary           基础工资
     * @param maxSalary            最大工资
     * @param minSalary            最小工资
     * @param paySalaryDate        发薪日期
     * @param payType              结算方式
     * @param salaryOtherNotice    工资其他说明
     * @param liveNotice           住宿说明
     * @param foodNotice           饮食说明
     * @param socialSecurityNotice 社保说明
     * @param liveFoodOtherNotice  其他说明
     * @param jobText              工作内容
     * @param jobTimeNotice        工作时间说明
     * @param jobWay               工作方式
     * @param jobOtherNotice       工作其他说明
     * @param sexRequest           性别要求
     * @param maxAgeRequest        最大年龄要求
     * @param minAgeRequest        最小年龄要求
     * @param eduBackground        学历要求
     * @param minExpRequest        最小经验要求
     * @param maxExpRequest        最大经验要求
     * @param credentialRequest    证书要求
     * @param employOtherNotice    雇佣其他说明
     * @param startTime            开始时间
     * @param endTime              结束时间
     * @param deadline             截止时间
     * @param applyRequest         报名要求
     * @param otherNotice          其他说明
     */
    void editConsign(
            Integer consignId,
            Integer positionId,
            Integer requirePopulation,
            String contact,
            String address,
            double baseSalary,
            double maxSalary,
            double minSalary,
            Integer paySalaryDate,
            String payType,
            String salaryOtherNotice,
            String liveNotice,
            String foodNotice,
            String socialSecurityNotice,
            String liveFoodOtherNotice,
            String jobText,
            String jobTimeNotice,
            String jobWay,
            String jobOtherNotice,
            Boolean sexRequest,
            Integer maxAgeRequest,
            Integer minAgeRequest,
            String eduBackground,
            Integer minExpRequest,
            Integer maxExpRequest,
            String credentialRequest,
            String employOtherNotice,
            String startTime,
            String endTime,
            String deadline,
            String applyRequest,
            String otherNotice
    );

    /**
     * 获取委培基本信息
     *
     * @param consignId 委培id
     * @return 委培基本信息
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignBasicInformation(Integer consignId) throws ConsignException;

    /**
     * 获取委培重要指标
     *
     * @param consignId 委培id
     * @return 委培重要指标
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getConsignIndex(Integer consignId) throws ConsignException;

    /**
     * 获取最近编辑委培
     *
     * @return 最近编辑委培
     * @throws ConsignException 委培异常
     */
    Map<String, Object> getRecentEditorConsign() throws ConsignException;

    /**
     * 分页筛选委培
     *
     * @param positionId 工种id
     * @param pageNo     页码
     * @param pageSize   页大小
     * @param keyWord    关键字
     * @return 委培列表
     * @throws ConsignException 系统消息异常
     */
    MyPageInfo getConsignOutline(
            Integer positionId,
            Integer pageNo,
            Integer pageSize,
            String keyWord
    ) throws ConsignException;

    /**
     * 分页筛选委培
     *
     * @param pageNo     页码
     * @param pageSize   页大小
     * @return 委培列表
     * @throws ConsignException 系统消息异常
     * @author 吴展鹏
     */
    MyPageInfo getConsignOrganOutline(
            Integer pageNo,
            Integer pageSize,
            String state
    )throws ConsignException;

    /*
     *  机构确认委培信息,修改对应的post状态
     *   @param consignId 委培ID
     *   @return 机构确认委培信息
     *   @author 吴展鹏
     * */
    void updateConsignOrganConfirm(Integer consignId)throws ConsignException;

    /*
     *
     * 管理端确认接受委培的机构，给consign表的对应consignId加organId
     * @Param consignId
     * @param orginId
     * @return 管理端确认委培机构
     * @author 吴展鹏
     *
     * */
    String updateConsignInsertOrganId(Integer consignId, Integer organId)throws ConsignException;
}
